#ifndef NETTYPE_H
#define NETTYPE_H

#include <pcap.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>


//这里定义以太网包头
typedef struct{
    //目的节点和源节点的mac地址
    u_char dhost_mac[6];
    u_char shost_mac[6];

    //上层包的类型，无符号short，两个字节，
    //对应16进制，一个数字代表4位
    // 0800H:IP
    // 0806H:ARP
    // 8035H:RARP
    u_short type;

} ethernet_header_t;

//定义地址
typedef struct ip_address{
    u_char byte1;
    u_char byte2;
    u_char byte3;
    u_char byte4;
}ip_address;

//IP头部
typedef struct ip_header {
    u_int8_t ip_version:4, ip_header_length : 4;    //ip 4位版本和4位首部长度
    u_int8_t ip_tos;    //8位服务类型
    u_int16_t ip_length;   //16位总长度
    u_int16_t ip_id;    //16位标识
    u_int16_t ip_off;   //16位偏移
    u_int8_t ip_ttl;    //8位生存时间
    u_int8_t ip_protocol;   //8位协议
    u_int16_t   ip_checksum;    //16位首部校验和
    ip_address saddr;   //源IP地址
    ip_address daddr;   //目的IP地址
    char data[0];
}ip_header;


//这里定义ip包头
typedef struct{
    //版本号和报文长度在一个字节
    u_char ver_and_len;
    //服务类型
    u_char type_of_service;
    //总长度，报头的长度和数据部分的长度之和
    u_short total_len;
    //标识，IP将大包分片了，这里是每一个片的序号
    u_short fragmentation_id;
    //这个片的元数据，以及这个此片相对于整个包的偏移量
    u_short flag_and_segment;
    //报文的生存时间，规定了报文的转发次数
    u_char TTL;
    //上层所使用的协议，1是ICMP，6是TCP，17是UDP
    u_char protocol;
    //校验码
    u_short checksum;
    //源地址
    u_int src_ip;
    //目的地址
    u_int dest_ip;
    //还有32位选项
} ip_header_t;

// 这里定义TCP包头
typedef struct{
    //源端口号 目的端口号
    u_short src_port;
    u_short dst_port;

    // 序号和确认序号，也就是常说的seq和ack
    u_int seq_no;
    u_int ack_no;

    u_char HLen;//首部长度（以及保留位）
    u_char Flag;//标识（以及保留位）

    u_short win_size;//窗口大小
    u_short check_sum;

    u_short UrgPtr;//紧急指针

} tcp_header_t;

typedef struct{
    u_short src_port;
    u_short dst_port;
    u_short len;
    u_short check_sum;
} udp_header_t;

typedef struct{
    //类型字段
    u_char type;
    //一个类型字段的功能，也就是代码域
    u_char code;
    //16位的校验和
    u_short check_sum;
} icmp_header_t;



// //定义链路层数据包格式
// typedef struct
// {
//     u_char DestMac[6];
//     u_char SrcMac[6];
//     u_char Etype[2];
// } ETHHEADER;

// //定义IP首部格式
// typedef struct ip_hdr
// {
//     unsigned char h_verlen;        //4位首部长度，4位IP版本号
//     unsigned char tos;             //8位服务类型TOS
//     unsigned short tatal_len;      //16位总长度
//     unsigned short ident;          //16位标示
//     unsigned short frag_and_flags; //偏移量和3位标志位
//     unsigned char ttl;             //8位生存时间TTL
//     unsigned char proto;           //8位协议（TCP,UDP或其他）
//     unsigned short checksum;       //16位IP首部检验和
//     unsigned int sourceIP;         //32位源IP地址
//     unsigned int destIP;           //32位目的IP地址
// } IPHEADER;

// //定义TCP首部格式
// typedef struct tcp_hdr
// {
//     unsigned short sport; //16位源端口
//     unsigned short dport; //16位目的端口
//     unsigned int seq;     //32位序列号
//     unsigned int ack;     //32位确认号
//     unsigned char lenres; //4位首部长度/6位保留字
//     unsigned char flag;   //6位标志位
//     unsigned short win;   //16位窗口大小
//     unsigned short sum;   //16位检验和
//     unsigned short urp;   //16位紧急数据偏移量
// } TCPHEADER;



#endif